package com.binc.testspring.common.pojo.service.impl;

import com.binc.testspring.common.handler.DictDataDto;
import com.binc.testspring.common.handler.DictTypeDto;
import com.binc.testspring.common.pojo.service.IDictService;
import com.binc.testspring.common.utils.Global;
import com.binc.testspring.common.utils.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 这个是idictservice接口的实现类
 *  作用是查字典、查缓存，这个如果类如果没有的话，字典爷爷那个翻译，但是会在中间报一个
 *【
 *   请实现com.binc.testspring.base.service.IDictService接口
 *      org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type
 *      'com.binc.testspring.base.service.IDictService' available
 *  】
 *  的异常（这个异常只是提示，但是不会阻碍程序的进行），如果不想看这个异常的话，建议将这个实现类加上，重写getByTypes的方法中直接返回null 就行了，那样的话，异常就不会报了
 *
 *  如果项真实的查字典，并且根据字典翻译的的话，这里认证重写getByTypes方法就行了；   getByTypes1是一个真是的例子；
 *
 *  注意：如果字典返回成功的话，就是不在看枚举的结果了，如果字典没有匹配的话，会用枚举的再翻译一遍，；
 *
 */
@Slf4j
@Component
public class OpsDictService implements IDictService {

    // @Autowired
    // private DictTypeController dictTypeSrv;  //这个就是真是的查字典的服务

    @Override
    public List<DictTypeDto> getByTypes(List<String> list) {
        return null;
    }
        // @Override
    public List<DictTypeDto> getByTypes1(List<String> list) {
        RedisUtil redisUtil = Global.getBean(RedisUtil.class);
        List<DictTypeDto> dictTypeDtos = new ArrayList<>();
        List<String> notCodes = new ArrayList<>();
        List<String> param = list.stream().map(p -> "erp:contract:api:code:" + p).collect(Collectors.toList());
        List<Object> redisData = redisUtil.get(param);
        if (redisData != null){
            dictTypeDtos = redisData.stream().map(a->(DictTypeDto)a).filter(b->b != null).collect(Collectors.toList());
            notCodes = dictTypeDtos.stream().map(DictTypeDto::getCode).collect(Collectors.toList());
        }
        list.removeAll(notCodes);
        if (list.size() > 0) {
            List<DictTypeDto> dictCodes = null;
            try {
                // dictCodes = BeanUtils.copyDepthProperties((List)dictTypeSrv.findListDictTypeByCodesUsingGET(list).getData(),DictTypeDto.class);
                // dictCodes = BeanUtils.copyProperties((List)dictTypeSrv.findListDictTypeByCodesUsingGET(list).getData(),DictTypeDto.class);
                DictTypeDto dictTypeDto = new DictTypeDto();
                dictTypeDto.setCode("status_code");
                List<DictDataDto> dictDataDtos  = new ArrayList<>();

                DictDataDto dataDto = new DictDataDto();
                dataDto.setVal(1);
                dataDto.setDictDataName("审核通过");

                DictDataDto dataDto2 = new DictDataDto();
                dataDto2.setVal(2);
                dataDto2.setDictDataName("审核否决");

                DictDataDto dataDto3 = new DictDataDto();
                dataDto3.setVal(3);
                dataDto3.setDictDataName("等待审核");
                dictDataDtos.add(dataDto);
                dictDataDtos.add(dataDto2);
                dictDataDtos.add(dataDto3);
                dictTypeDto.setDictDataDtos(dictDataDtos);
                dictTypeDtos.add(dictTypeDto);
                //BeanUtils.copyProperties(null,dictCodes);
            } catch (Exception e) {
            // } catch (BusinessException e) {
                log.error(e.getMessage(), e);
            }
            if (dictCodes != null && dictCodes.size() > 0) {
                dictCodes.forEach(code -> {
                    redisUtil.set("erp:contract:api:code:" + code.getCode(), code);
                });
                dictTypeDtos.addAll(dictCodes);
            }
        }
        return dictTypeDtos;
    }
}
